﻿#include <stdio.h>
#include <string.h >


//1.结构体相关
//2.整型提升
//3.逗号表达式，常见错误
// !!!!!!!!!!!!!!!!                     结构体            ！！！！！！！！！！！！！
//1. 结构体的基本概念
//结构体是一种复合数据类型，用于将多个不同类型的变量组合成一个整体，便于管理和操作。
//例如，在C语言中，结构体通过struct关键字定义，可以包含字符数组、整数、浮点数等不同类型的数据成员。
//结构体的成员可以通过点运算符（.）或指针运算符访问！

//struct  Stu
//{
//	char name[20];
//	int age;
//	float score;
//	char id[15];
//}s6,s7,s8;//全局变量
//
//
//int main()
//{
//	struct Stu s1 = { "dingzi",20,85.5f,"1131224121" };
//	s1.age = 21;
//	//s1.name = "zhangsan";  //错误示范
//	                         //正确示范
//	strcpy_s(s1.name, "zhangsansan");
//	struct Stu s2 = { "ygr",18,100.0,"10010508" };
//	//初始化操作
//	//struct Stu s9 = { .age = 22, .name = "cuihua", .score = 88.5f, .id = "2024020201" };
//
//	printf("%s\n", s1.name);
//	printf("%d\n", s1.age);
//	printf("%f\n", s1.score);
//	/*printf("%c\n", s1.sb.ch);
//	printf("%d\n", s1.sb.num);*/
//	printf("%s\n", s1.id);
//	return 0;
//}
//s1.age = 21; //  int类型可以直接修改
//基本类型成员：像int、float等基本类型的成员可以直接用赋值运算符修改。
//// s1.name = "zhangsansan"; // 错误写法
//字符数组成员：不能直接用赋值运算符修改字符数组（字符串），因为数组名是常量指针。
//strcpy(s1.name, "zhangsansan"); // 正确方式
//字符串修改方法：
//strcpy()函数（需要#include <string.h>）
//strncpy()（更安全，可以指定最大拷贝长度）
//memcpy()（内存拷贝）



//                          	嵌套结构体

//           嵌套结构体  ：访问方式   ！！！结构体编号（与结构体名不同）  +   结构体编号    
//struct B  
//{
//	char ch;
//	int num;
//};
//
////学生:名字,年龄,成绩,学号
//struct Stu
//{
//	char name[20];
//	int age;
//	float score;
//	struct B sb;
//	char id[15];
//};

//例如

     // printf("%c\n", s1.sb.ch);
	//	printf("%d\n", s1.sb.num);


//              整型提升                
//整型提升是C / C++中的一种隐式类型转换规则，主要用于处理小于int的整型类型（如char、short）在表达式中的运算。
// 	它的核心目的是为了保证运算的精度和一致性。

//int main()
//{
//	char a = 4;
//	//00000000000000000000000000000100
//	//00000100 - a   截断后
//	char b = 127;
//	//00000000000000000000000001111111
//	//01111111 - b 
//	char c = a + b;//整型提升
//	//00000100 - a
//	//提升:a的类型是char类型,在vs中char==signed char
//	//00000000000000000000000000000100
//	//01111111 - b
//	//提升:b的类型是char类型,在vs中char==signed char
//	//00000000000000000000000001111111
//	//
//	//00000000000000000000000000000100
//	//00000000000000000000000001111111 +
//	//00000000000000000000000010000011
//	//10000011 - c截断后以首位补充
  


//                  截断后形成的是补码！
//	printf("%d\n", c);
//	//11111111111111111111111110000011补码
//	//10000000000000000000000001111100反码
//	//10000000000000000000000001111101原码
//	// 再颠倒回来
//	// -125
//
//	return 0;
//}

//%d 打印数据,十进制的形式打印有符号的整数 int
//%u 打印无符号的整型,unsigned int

                //       CPU的整数运算单元(ALU)直接处理补码：
//
//提升时符号扩展
//如signed char c = -128; int i = c;
//补码过程：
//
//c的补码 : 10000000 (8位)
//提升为int补码 : 11111111_11111111_11111111_10000000(32位)
//截断时直接取低位
//如signed int i = -12345; short s = i;
//补码过程：
//
//i的补码 : 11111111_11111111_11001111_11000111(32位)
//截断为short补码 : 11001111_11000111(16位)



//                          整型提升的本质】
//整型提升后的结果始终以「补码」形式存在内存中：
//• CPU进行整型提升时直接操作的是原始数据的二进制形式
//• 无论正负都遵循以下规则扩展位数 :
//→ 正数高位填「0」(例如将8位的数字3扩展到32位仍是「00...001011」)
//→ 负数高位填「1」(例如将8位的数字 - 5扩展到32位变为「11...110101」)
//
//【关于编码转换】
//Q："从内存中的『补』获取『原』必须『取反减一』吗？"
//
// 两种等效方法均可实现转换 :
//
//① 经典方法：「先减一再取反」（适合理解原理）
//② 快捷方法：「直接再次取反加一」（利用数学对称性）

//
// 
// 
// 
//              逗号表达式，常见错误
// 
// 
// 
// 
// 
#include <stdio.h>

int fun()
{
    static int count = 1;
    return ++count;
}
int main()
{
    int answer;
    answer = fun() - fun() * fun();
    printf("%d\n", answer);//输出多少？-10
    return 0;
}


// #include <stdio.h>
//int main()
//{
//    int i = 1;
//    int ret = (++i) + (++i) + (++i);
//
//    printf("ret = %d\n", ret);
//    printf("i = %d\n", i);
//
//    return 0;
//}
//


